home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 18 / CU Amiga Magazine's Super CD-ROM 18 (1997)(EMAP Images)(GB)[!][issue 1998-01].iso / CUCD / Programming / ModemLink / Source / DeviceStuff.c < prev    next >
C/C++ Source or Header  |  1997-10-24  |  3KB  |  137 lines

  1. /*
  2. ** NAME: DeviceStuff.c
  3. ** DESC: Routines which make dealing with devices a little easier.
  4. **
  5. ** AUTHOR:        DATE:       DESCRIPTION:
  6. ** ~~~~~~~~~~~~~~ ~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  7. ** Mike Veroukis  06 Apr 1997 Created
  8. */
  9.  
  10. #include "DeviceStuff.h"
  11.  
  12. #include <exec/types.h>
  13. #include <exec/io.h>
  14. #include <exec/ports.h>
  15. #include <devices/serial.h>
  16. #include <devices/timer.h>
  17.  
  18. #include <proto/exec.h>
  19.  
  20. #include <stdio.h>
  21.  
  22. int OpenTimerDevice(struct MsgPort **TimerMP, struct timerequest **TimerIO)
  23. {
  24.   if (*TimerMP = CreateMsgPort()) {
  25.     if (*TimerIO = CreateIORequest(*TimerMP, sizeof(struct timerequest))) {
  26.       if (!OpenDevice(TIMERNAME, UNIT_VBLANK, (struct IORequest *)*TimerIO, 0))
  27.         return(1);
  28.       DeleteIORequest((struct IORequest *) *TimerIO);
  29.     }
  30.     DeleteMsgPort(*TimerMP);
  31.   }
  32.  
  33.   return(0);
  34. }
  35.  
  36. int OpenSerialDevice(struct MsgPort **SerMP, struct IOExtSer **SerIO, char *SerName, LONG Unit)
  37. {
  38.   ULONG err;
  39.  
  40.   if (*SerMP = CreateMsgPort()) {
  41.     if (*SerIO = CreateIORequest(*SerMP, sizeof(struct IOExtSer))) {
  42.       (*SerIO)->io_SerFlags = SERF_SHARED;
  43.       err = OpenDevice(SerName, Unit, (struct IORequest *)*SerIO, 0L);
  44.       if (!err)
  45.         return(1);
  46.       DeleteIORequest((struct IORequest *) *SerIO);
  47.     }
  48.     DeleteMsgPort(*SerMP);
  49.   }
  50.  
  51.   return(0);
  52. }
  53.  
  54. int TimedIO(struct IORequest *IOReq, int TimeOut)
  55. {
  56.   struct timerequest *TimerIO = NULL;
  57.   struct MsgPort *TimerMP = NULL;
  58.   ULONG IOBit, TimerBit;
  59.   int ReturnCode = NULL;
  60.  
  61.   if (IOReq && OpenTimerDevice(&TimerMP, &TimerIO)) {
  62.     IOBit = 1 << IOReq->io_Message.mn_ReplyPort->mp_SigBit;
  63.     TimerBit = 1 << TimerMP->mp_SigBit;
  64.  
  65.     TimerIO->tr_node.io_Command = TR_ADDREQUEST;
  66.     TimerIO->tr_time.tv_secs = TimeOut;
  67.     TimerIO->tr_time.tv_micro = 0;
  68.  
  69.     SendIO((struct IORequest *) TimerIO);
  70.     SendIO(IOReq);
  71.  
  72.     for (;;) {
  73.       Wait(IOBit | TimerBit);
  74.  
  75.       if (CheckIO(IOReq)) {
  76.         ReturnCode = 1;
  77.         break;
  78.       }
  79.  
  80.       if (CheckIO((struct IORequest *)TimerIO))
  81.         break;
  82.     }
  83.     DoAbortIO(IOReq);
  84.     DoAbortIO((struct IORequest *)TimerIO);
  85.  
  86.     SafeCloseDevice(TimerMP, (struct IORequest *)TimerIO);
  87.   }
  88.  
  89.   return(ReturnCode);
  90. }
  91.  
  92. void DoAbortIO(struct IORequest *IO)
  93. {
  94.   if (CheckIO(IO) == 0)
  95.     AbortIO(IO);
  96.   WaitIO(IO);
  97. }
  98.  
  99. void SafeCloseDevice(struct MsgPort *MP, struct IORequest *IO)
  100. {
  101.   if (IO) {
  102.     CloseDevice(IO);
  103.     DeleteIORequest(IO);
  104.   }
  105.  
  106.   if (MP)
  107.     DeleteMsgPort(MP);
  108. }
  109.  
  110. int CloneIO(struct IORequest *IO, struct MsgPort **NewMP, struct IORequest **NewIO)
  111. {
  112.   if (IO && NewMP && NewIO) {
  113.     if (*NewMP = CreateMsgPort()) {
  114.       if (*NewIO = CreateIORequest(*NewMP, IO->io_Message.mn_Length)) {
  115.         CopyMem(IO, *NewIO, IO->io_Message.mn_Length);
  116.         (*NewIO)->io_Message.mn_ReplyPort = *NewMP;
  117.         return(1);
  118.       }
  119.       DeleteMsgPort(*NewMP);
  120.     }
  121.   }
  122.  
  123.   *NewMP = NULL;
  124.   *NewIO = NULL;
  125.  
  126.   return(0);
  127. }
  128.  
  129. void DeleteIO_MP(struct MsgPort *MP, struct IORequest *IO)
  130. {
  131.   if (IO)
  132.     DeleteIORequest(IO);
  133.  
  134.   if (MP)
  135.     DeleteMsgPort(MP);
  136. }
  137.